﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TpBaseObjects.Properties;
using TpExtensions;


namespace TpBaseObjects.Objects {
    public class InvoiceObject {

        #region Members

        private int rechnungsNummer = 0;
        private List<Person> myPersons = new List<Person>();

        #endregion

        #region Constructors

        public InvoiceObject() {
        }

        public InvoiceObject(int rechnungsNummer)
            : this() {
            this.rechnungsNummer = rechnungsNummer;
        }

        #endregion

        #region Properties

        public List<string> Abnahmeprotokolle {
            get;
            set;
        }

        public bool AFAuftragTelefon {
            get;
            set;
        }

        private DateTime afAuftragTelefonDatum;
        public Nullable<DateTime> AFAuftragTelefonDatum {
            get {
                if (afAuftragTelefonDatum == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return afAuftragTelefonDatum;
                }
            }
            set { this.afAuftragTelefonDatum = (DateTime)value; }
        }

        public string AFAuftragTelefonText {
            get;
            set;
        }

        public bool AFAuftragPers {
            get;
            set;
        }

        private DateTime afAuftragPersDatum = DateTime.Now;
        public Nullable<DateTime> AFAuftragPersDatum {
            get {
                if (afAuftragPersDatum == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return afAuftragPersDatum;
                }
            }
            set { this.afAuftragPersDatum = (DateTime)value; }
        }

        public string AFAuftragPersText {
            get;
            set;
        }

        public bool AFAbCheck {
            get;
            set;
        }

        private DateTime afAbDatum = DateTime.Now;
        public Nullable<DateTime> AFAbDatum {
            get {
                if (afAbDatum == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return afAbDatum;
                }
            }
            set { this.afAbDatum = (DateTime)value; }
        }

        public string AFAbText {
            get;
            set;
        }

        private DateTime afDurchfuehrungVon = DateTime.Now;
        public Nullable<DateTime> AFDurchfuehrungVon {
            get {
                if (afDurchfuehrungVon == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return afDurchfuehrungVon;
                }
            }
            set { this.afDurchfuehrungVon = (DateTime)value; }
        }

        private DateTime afDurchfuehrungBis = DateTime.Now;
        public Nullable<DateTime> AFDurchfuehrungBis {
            get {
                if (afDurchfuehrungBis == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return afDurchfuehrungBis;
                }
            }
            set { this.afDurchfuehrungBis = (DateTime)value; }
        }

        private DateTime aKontoDatum = DateTime.Now;
        public Nullable<DateTime> AKontoDatum {
            get {
                if (aKontoDatum == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return aKontoDatum;
                }
            }
            set { this.aKontoDatum = (DateTime)value; }
        }

        public string AKontoText {
            get;
            set;
        }

        public double AKontoBetrag {
            get;
            set;
        }

        public int AnzahlAbnahmeprotokolle {
            get;
            set;
        }

        public int AnzahlLieferscheine {
            get;
            set;
        }

        public DateTime ArbeitsDatum {
            get {
                return (DateTime)AFDurchfuehrungBis;
            }
        }

        private Global.AuftragsArt auftragsArt;
        public Global.AuftragsArt AufstragsArt {
            get {
                return this.auftragsArt;
            }
            set {
                this.auftragsArt = value;
                if (this.auftragsArt == Global.AuftragsArt.Telefonisch) {
                    AFAuftragTelefon = true;
                    AFAuftragPers = false;
                }
                if (this.auftragsArt == Global.AuftragsArt.Persoenlich) {
                    AFAuftragTelefon = false;
                    AFAuftragPers = true;
                }
            }
        }

        public DateTime AuftragsDatum {
            get {
                DateTime ret = DateTime.Now;
                if (this.auftragsArt == Global.AuftragsArt.Telefonisch) {
                    ret = (DateTime)AFAuftragPersDatum;
                }
                if (this.auftragsArt == Global.AuftragsArt.Persoenlich) {
                    ret = (DateTime)AFAuftragTelefonDatum;
                }
                if (AFAbCheck) {
                    ret = (DateTime)AFAbDatum;
                }
                return ret;
            }
        }

        public string Auftraggeber {
            get;
            set;
        }

        public string AuftraggeberHdn {
            get;
            set;
        }

        public string AuftraggeberMail {
            get;
            set;
        }

        public string AuftraggeberStrasse {
            get;
            set;
        }

        public string AuftraggeberPlzOrt {
            get;
            set;
        }

        public double AufwandVorjahr {
            get;
            set;
        }

        public string Beilage {
            get {
                string ret = "";
                //if (BeilageCheckLS) {
                //    ret += "Lieferschein";
                //    if (AnzahlLieferscheine > 1) {
                //        ret += "e";
                //    }
                //    if (BeilageLSDate1.Value.Year > 1900) {
                //        ret += " " + BeilageAPDate1.Value.ToString(Extensions.tpDateFormatExtern);
                //    }
                //    if (BeilageLSDate2.Value.Year > 1900) {
                //        ret += " " + BeilageLSDate2.Value.ToString(Extensions.tpDateFormatExtern);
                //    }
                //    if (BeilageLSDate3.Value.Year > 1900) {
                //        ret += " " + BeilageLSDate3.Value.ToString(Extensions.tpDateFormatExtern);
                //    }
                //}
                //if (BeilageCheckAP) {
                //    if (ret.Length > 0) {
                //        ret += ", ";
                //    }
                //    ret += "Abnahmeprotokoll";
                //    if (AnzahlAbnahmeprotokolle > 1) {
                //        ret += "e";
                //    }
                //    if (BeilageAPDate1.Value.Year > 1900) {
                //        ret += " " + BeilageAPDate1.Value.ToString(Extensions.tpDateFormatExtern);
                //    }
                //    if (BeilageAPDate2.Value.Year > 1900) {
                //        ret += " " + BeilageAPDate1.Value.ToString(Extensions.tpDateFormatExtern);
                //    }
                //    if (BeilageAPDate3.Value.Year > 1900) {
                //        ret += " " + BeilageAPDate1.Value.ToString(Extensions.tpDateFormatExtern);
                //    }
                //}
                //if (BeilageZusatzTextCheck) {
                //    if (ret.Length > 0) {
                //        ret += ", " + BeilageZusatzText;
                //    } else {
                //        ret += BeilageZusatzText;
                //    }
                //}
                //if (BeilageDateiCheck) {
                //    if (ret.Length > 0) {
                //        ret += ", " + BeilageDatei;
                //    } else {
                //        ret += BeilageDatei;
                //    }
                //}
                //if (Zahlschein) {
                //    if (ret.Length > 0) {
                //        ret += ", " + "Zahlschein";
                //    } else {
                //        ret += "Zahlschein";
                //    }
                //}
                return ret;
            }
        }

        public List<Beilage> Beilagen {
            get;
            set;
        }

        public bool BeilageCheckAP {
            get;
            set;
        }

        public bool BeilageCheckLS {
            get;
            set;
        }

        private DateTime beilageLSDate1;
        public Nullable<DateTime> BeilageLSDate1 {
            get {
                if (beilageLSDate1 == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return beilageLSDate1;
                }
            }
            set { this.beilageLSDate1 = (DateTime)value; }
        }

        private DateTime beilageLSDate2;
        public Nullable<DateTime> BeilageLSDate2 {
            get {
                if (beilageLSDate2 == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return beilageLSDate2;
                }
            }
            set { this.beilageLSDate2 = (DateTime)value; }
        }

        private DateTime beilageLSDate3;
        public Nullable<DateTime> BeilageLSDate3 {
            get {
                if (beilageLSDate3 == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return beilageLSDate3;
                }
            }
            set { this.beilageLSDate3 = (DateTime)value; }
        }

        private DateTime beilageAPDate1;
        public Nullable<DateTime> BeilageAPDate1 {
            get {
                if (beilageAPDate1 == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return beilageAPDate1;
                }
            }
            set { this.beilageAPDate1 = (DateTime)value; }
        }

        private DateTime beilageAPDate2;
        public Nullable<DateTime> BeilageAPDate2 {
            get {
                if (beilageAPDate2 == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return beilageAPDate2;
                }
            }
            set { this.beilageAPDate2 = (DateTime)value; }
        }

        private DateTime beilageAPDate3;
        public Nullable<DateTime> BeilageAPDate3 {
            get {
                if (beilageAPDate3 == null) {
                    return DateTimePicker.MinimumDateTime;
                } else {
                    return beilageAPDate3;
                }
            }
            set { this.beilageAPDate3 = (DateTime)value; }
        }

        public bool BeilageZusatzTextCheck {
            get;
            set;
        }

        public string BeilageZusatzText {
            get;
            set;
        }

        public bool BeilageDateiCheck {
            get;
            set;
        }

        public string BeilageDatei {
            get;
            set;
        }

        public string Betreff {
            get {
                string ret = "";
                if (this.rechnungsNummer != 0) {
                    ret = "Rechnung " + String.Format("{0:#}", Convert.ToInt32(this.Rechnungsdatum.Year.ToString().Right(2) + "000") + this.rechnungsNummer);
                }
                return ret;
            }
        }

        public string Ccy {
            get;
            set;
        }

        public bool CheckAuftraggeberPerson {
            get;
            set;
        }

        public bool IsBusiness {
            get {
                bool ret = false;
                if (AFAbText.Trim().IndexOf("p") == 4) { ret = true; }
                return ret;
            }
        }

        public bool IsFirstInvoice {
            get;
            set;
        }

        public string Kunde {
            get;
            set;
        }

        public List<string> Lieferscheine {
            get;
            set;
        }

        public string Ma {
            get;
            set;
        }

        public string Ma2 {
            get;
            set;
        }

        public List<Person> MyPersons {
            get {
                return myPersons;
            }
            set {
                this.myPersons = value;
            }
        }

        public string PersonenKonto {
            get;
            set;
        }

        public string ProjektBezeichnung {
            get;
            set;
        }

        public double RechnungsBetrag {
            get {
                double ret = this.SummeBrutto;
                if (AKontoBetrag != 0.0) {
                    ret = this.SummeBrutto - this.AKontoBetrag;
                }
                return ret;
            }

        }

        public int RechnungsNummer {
            get { return this.rechnungsNummer; }
            set { this.rechnungsNummer = value; }
        }

        public string ReEmpfaenger {
            get;
            set;
        }

        public string ReEmpfaengerMail {
            get;
            set;
        }

        public bool RePersonCheck {
            get;
            set;
        }

        public string RePerson {
            get;
            set;
        }

        public string ReStrasse {
            get;
            set;
        }

        public string RePlzOrt {
            get;
            set;
        }

        public string ReBetreff {
            get;
            set;
        }

        private Global.InvoiceSendType sendType;
        public Global.InvoiceSendType RechnungVersand {
            get { return this.sendType; }
            set {
                this.sendType = value;

            }
        }

        public DateTime Rechnungsdatum {
            get;
            set;
        }

        public string SachKonto {
            get;
            set;
        }

        public double SkontoBetrag {
            get;
            set;
        }

        public int SkontoFrist {
            get;
            set;
        }

        public double SkontoProzent1 {
            get;
            set;
        }

        public double SkontoProzent2 {
            get;
            set;
        }

        public int SkontoTage1 {
            get;
            set;
        }

        public int SkontoTage2 {
            get;
            set;
        }

        public int SkontoTage3 {
            get;
            set;
        }

        public double SummeBrutto {
            get;
            set;
        }

        public double SummeNetto {
            get;
            set;
        }

        public bool Teilrechnung {
            get;
            set;
        }

        public string UID {
            get;
            set;
        }

        public double Ust {
            get;
            set;
        }

        public double UstPercent {
            get;
            set;
        }

        public Global.InvoicePayType ZahlArt {
            get;
            set;
        }

        public bool Zahlschein {
            get;
            set;
        }

        public int ZahlungsFrist {
            get;
            set;
        }

        public string ZahlungsInfo {
            get {
                string ret = "";

                if (SummeBrutto < 0) {
                    return "";
                }

                #region Bar

                string zahlungsText = "";
                switch (ZahlArt) {
                    case Global.InvoicePayType.BarBeiAbholung:
                        zahlungsText = "bei Abholung";
                        break;
                    case Global.InvoicePayType.BarBeiLieferung:
                        zahlungsText = "bei Lieferung";
                        break;
                    case Global.InvoicePayType.BarNachMontage:
                        zahlungsText = "nach Montage";
                        break;
                    case Global.InvoicePayType.BarNachReparatur:
                        zahlungsText = "nach Reparatur";
                        break;

                }

                if (ZahlArt != Global.InvoicePayType.NachRechnungserhalt) {
                    if (this.AKontoBetrag != 0) {
                        if (this.SkontoProzent1 != 0) {
                            ret += String.Format(Resources.InvTextZahlInfo03,
                                    zahlungsText,
                                    this.AKontoBetrag.ToString("#,0.00"),
                                    this.SkontoProzent1.ToString("#,0.00"),
                                    Math.Abs(this.SkontoBetrag).ToString("#,0.00"),
                                    (this.RechnungsBetrag - Math.Abs(this.SkontoBetrag)).ToString("#,0.00"));
                        } else {
                            double d1 = (double)AKontoBetrag;
                            ret += String.Format(Resources.InvTextZahlInfo02,
                                    zahlungsText,
                                    this.AKontoBetrag.ToString("#,0.00"),
                                    this.RechnungsBetrag.ToString("#,0.00"));
                        }
                    } else {
                        if (this.SkontoBetrag == 0.0) {
                            ret += String.Format(Resources.InvTextZahlInfo01, zahlungsText);
                        } else {
                            ret += String.Format(Resources.InvTextZahlInfo08,
                                zahlungsText,
                                this.SkontoProzent1.ToString("#,0.00"),
                                Math.Abs(this.SkontoBetrag).ToString("#,0.00"), 
                                (this.RechnungsBetrag - Math.Abs(this.SkontoBetrag)).ToString("#,0.00")
                                );
                        }
                    }
                }


                #endregion

                #region Überweisung

                if (ZahlArt == Global.InvoicePayType.NachRechnungserhalt) {
                    if (this.SkontoBetrag != 0.0) {
                        //string t1 = "";
                        if (this.AKontoBetrag != 0.0) {
                            //t1 = String.Format(Resources.InvTextZahlInfoAkonto, this.AKontoBetrag.ToString("#,0.00"));
                            ret += String.Format(Resources.InvTextZahlInfo07,
                                this.SkontoTage1.ToString("0"),
                                this.AKontoBetrag.ToString("#,0.00"),
                                this.SkontoProzent1.ToString("#,0.00"),
                                Math.Abs(this.SkontoBetrag).ToString("#,0.00"),
                                (this.RechnungsBetrag - Math.Abs(this.SkontoBetrag)).ToString("#,0.00"),
                                this.SkontoTage2.ToString("0"),
                                this.RechnungsBetrag.ToString("#,0.00")
                                );
                            ret += Resources.InvTextKontoNummer;
                            return ret;
                        }
                        ret += String.Format(Resources.InvTextZahlInfo06,
                            this.SkontoTage1.ToString("0"),
                            this.SkontoProzent1.ToString("#,0.00"),
                            Math.Abs(this.SkontoBetrag).ToString("#,0.00"),
                            (this.RechnungsBetrag - Math.Abs(this.SkontoBetrag)).ToString("#,0.00"),
                            this.SkontoTage2.ToString("0"),
                            this.RechnungsBetrag.ToString("#,0.00")
                            );
                        ret += Resources.InvTextKontoNummer;
                    } else {
                        if (this.AKontoBetrag != 0.0) {
                            ret += String.Format(Resources.InvTextZahlInfo05,
                                this.AKontoBetrag.ToString("#,0.00"),
                                this.RechnungsBetrag.ToString("#,0.00"));
                            ret += Resources.InvTextKontoNummer;
                            return ret;
                        }
                        ret += String.Format(Resources.InvTextZahlInfo04);
                        ret += Resources.InvTextKontoNummer;
                    }
                }

                #endregion

                return ret;
            }
        }

        #endregion

        #region Methods

        public void AddPerson(Person p) {
            myPersons.Add(p);
        }

        #endregion

        #region Overrides

        public override string ToString() {
            string ret = Auftraggeber + ";"
                + AuftraggeberHdn + ";"
                + AuftraggeberStrasse + ";"
                + AuftraggeberPlzOrt + ";"
                + AuftraggeberMail + ";"
                + ReEmpfaenger + ";"
                + RePerson + ";"
                + ReStrasse + ";"
                + RePlzOrt + ";"
                + ReBetreff + ";"
                + Rechnungsdatum.ToString(Extensions.tpDateFormat) + ";"
                + Ma + ";"
                + RechnungsNummer.ToString() + ";"
                + UID + ";"
                + RechnungVersand.ToString() + ";"
                + PersonenKonto + ";"
                + SachKonto + ";"
                + ZahlArt.ToString() + ";"
                + SummeNetto.ToString("#,0.00") + ";"
                + SummeBrutto.ToString("#,0.00") + ";"
                + Ust.ToString("#,0.00") + ";"
                + ((double)AKontoBetrag).ToString("#,0.00") + ";"
                + RechnungsBetrag.ToString("#,0.00") + ";"
                + IsFirstInvoice.ToString();
            return ret;
        }

        #endregion

    }
}
